route.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { NextRequest, NextResponse } from "next/server";
  2. import { getSupabaseAdminClient } from "@/lib/supabase/admin";
  3. import { getCurrentUser } from "@/lib/auth/current-user";
  4. import { deleteGroupAndData } from "@/lib/groups/delete-group";
  5. /** POST /api/groups/[id]/leave — Leave a group */
  6. export async function POST(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
  7. try {
  8. const { id } = await params;
  9. const user = await getCurrentUser(request);
  10. if (!user) {
  11. return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  12. }
  13. const admin = getSupabaseAdminClient();
  14. const { data: membership } = await admin
  15. .from("group_members")
  16. .select("role")
  17. .eq("group_id", id)
  18. .eq("user_id", user.id)
  19. .maybeSingle();
  20. if (!membership) {
  21. return NextResponse.json({ error: "Not a member of this group" }, { status: 403 });
  22. }
  23. const { count } = await admin
  24. .from("group_members")
  25. .select("*", { count: "exact", head: true })
  26. .eq("group_id", id);
  27. const isLastMember = count === 1;
  28. // If admin with other members, must transfer first
  29. if (membership.role === "admin" && !isLastMember) {
  30. return NextResponse.json(
  31. { error: "Transfer admin role before leaving. Use /api/groups/[id]/transfer first." },
  32. { status: 400 },
  33. );
  34. }
  35. if (isLastMember) {
  36. await deleteGroupAndData(id);
  37. return NextResponse.json({ success: true, groupDeleted: true });
  38. }
  39. const { error } = await admin
  40. .from("group_members")
  41. .delete()
  42. .eq("group_id", id)
  43. .eq("user_id", user.id);
  44. if (error) {
  45. return NextResponse.json({ error: "Failed to leave group" }, { status: 500 });
  46. }
  47. return NextResponse.json({ success: true, groupDeleted: false });
  48. } catch {
  49. return NextResponse.json({ error: "Internal server error" }, { status: 500 });
  50. }
  51. }